import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.GeneralPath;
import java.util.LinkedList;

/**
 * @uml.dependency supplier="Coordenada"
 */
public class DecisaoSimples extends Identificador implements RetanguloListener,
		IElementosChegadaPartida, IOperadoresComTexto {

	/**
	 * @uml.property name="ligacoesEntrada"
	 * @uml.associationEnd multiplicity="(0 -1)" ordering="true"
	 *                     inverse="decisaoSimples:Ligacao"
	 */

	private LigacaoIdentificadorDestinoTexto ligacaoVerdadeiro;

	private LigacaoIdentificadorDestinoTexto ligacaoFalso;

	/**
	 * @uml.property name="poligono"
	 */
	private GeneralPath poligono;

	/**
	 * @uml.property name="ligacaoFalsa"
	 * @uml.associationEnd inverse="decisaoSimples:Ligacao"
	 */

	/**
	 */
	public DecisaoSimples(String identificacao, Retangulo retanguloEnvolvente) {
		super(identificacao, retanguloEnvolvente);
	}

	/**
	 */
	public DecisaoSimples(Retangulo retanguloEnvolvente) {
		super(retanguloEnvolvente);
		retanguloEnvolvente.setRetanguloListener(this);
		construirDecisaoSimples();
	}

	/**
		 */
	public void construirDecisaoSimples() {
		int x = retanguloEnvolvente.getPontoSuperiorEsquerdo().getX();
		int y = retanguloEnvolvente.getPontoSuperiorEsquerdo().getY();
		int largura = retanguloEnvolvente.getTamanho().getLargura();
		int altura = retanguloEnvolvente.getTamanho().getAltura();

		this.poligono = new GeneralPath();
		this.poligono.moveTo(x + (altura / 2), y);
		this.poligono.lineTo(x + altura, y + (largura / 2));
		this.poligono.lineTo(x + (altura / 2), y + largura);
		this.poligono.lineTo(x, y + (largura / 2));
		this.poligono.lineTo(x + (altura / 2), y);
		this.poligono.closePath();
	}

	@Override
	public void retanguloAlterado() {
		construirDecisaoSimples();
	}

	/**
		 */
	public void desenhar(Graphics graphics) {
		Graphics2D g2 = (Graphics2D) graphics.create();
		g2.draw(this.poligono);

		g2.setColor(Color.BLACK);
		graphics.drawString(identificacao, this.retanguloEnvolvente
				.getPontoSuperiorEsquerdo().getX() - 50,
				this.retanguloEnvolvente.getPontoSuperiorEsquerdo().getY() + 5);
		g2.dispose();
	}

	/**
		 */
	public boolean isSob(Coordenada coordenada) {
		return this.retanguloEnvolvente.contem(coordenada);
	}

	@Override
	public boolean podeAssociar(Identificador identificadorDestino) {
		// TODO Auto-generated method stub
		if (identificadorDestino != this && ligacaoFalso == null)
			return true;
		else if (identificadorDestino != this && ligacaoVerdadeiro == null)
			return true;
		return false;
	}

	@Override
	public LigacaoIdentificadorDestinoTexto associarCTexto(
			Identificador identificadorDestino) {
		if (ligacaoFalso == null) {
			ligacaoFalso = new LigacaoIdentificadorDestinoTexto(this,
					identificadorDestino);
			return ligacaoFalso;
		} else {
			ligacaoVerdadeiro = new LigacaoIdentificadorDestinoTexto(this,
					identificadorDestino);
			return ligacaoVerdadeiro;

		}
	}
}
